package br.com.ruidobrasil.util {
	
	import mx.formatters.SwitchSymbolFormatter;
	
	public class FormatUtil {
		
		public static function formataCPFCNPJ(str:String):String {
			var strRetorno:String = str;
			
			
			if(strRetorno.length == 0)
				return strRetorno;
				
			strRetorno = StringUtils.trim( strRetorno);
			
			var pattern:RegExp = /\./g;
			strRetorno = strRetorno.replace(pattern, "");
			
			pattern = /\-/g;
			strRetorno = strRetorno.replace(pattern, "");

			pattern = /\//g;
			strRetorno = strRetorno.replace(pattern, "");

			if(strRetorno.length <= 11) { //CPF
				strRetorno = strRetorno.substr(0, 3) + "." +
					   		 strRetorno.substr(3, 3) + "." +
					   		 strRetorno.substr(6, 3) + "-" +
					   		 strRetorno.substr(9, 2);
			}else{ //CNPJ
				strRetorno = strRetorno.substr(0, 2) + "." +
					   		 strRetorno.substr(2, 3) + "." +
					   		 strRetorno.substr(5, 3) + "/" +
					   		 strRetorno.substr(8, 4) + "-" +
					   		 strRetorno.substr(12, 2);
			}
			
			return strRetorno;
		}
		
		public static function formataCEP(str:String):String {
			var strRetorno:String = str;
			
			if(strRetorno.length == 0)
				return strRetorno;
			
			strRetorno = strRetorno.replace("/./g", "");
			strRetorno = strRetorno.replace("/-/g", "");
			
			strRetorno = strRetorno.substr(0, 5) + "-" +
				   		 strRetorno.substr(5, 3);
					   		 
			return strRetorno;
		}
		
		public static function formataTelefone(str:String):String {
			var strRetorno:String = str;
			
			if(strRetorno.length == 0)
				return strRetorno;
			
			strRetorno = strRetorno.replace("/(/g", "");
			strRetorno = strRetorno.replace("/)/g", "");
			strRetorno = strRetorno.replace("/-/g", "");
			
			strRetorno = "(" + strRetorno.substr(0, 2) + ") " +
				   		 strRetorno.substr(2, 4) + "-" + strRetorno.substr(6, 9);
					   		 
			return strRetorno;
		}
		
		/*
			Formatar de acordo com padrão Janus da GENList
			vlr - valor a ser formatado
			mascara - mascara do formato
			tipo - tipo de dados (1-String, 2-Numérico, 3-Data, 4-Data e Hora, 5-Hora)
		*/
		public static function formataValor(vlr:Object, mascara:String, tipo:int=0):String {
			
			if(vlr == null)
				return "";
			
			var pattern:RegExp;
			
			// pega tipo de dados data e formata data
			if((vlr as Date) != null) {
				mascara = mascara.toUpperCase();
				
				pattern = /H/g;
				mascara = mascara.replace(pattern, "J");
				
				if(mascara.indexOf("J") >= 0){
					pattern = /M/g;
					var strMsk:String = mascara.substr(mascara.indexOf("J"));
					
					strMsk = strMsk.replace(pattern, "N");
					
					mascara = mascara.replace(mascara.substr(mascara.indexOf("J")), strMsk);
				}
				
				return FormataData.formata(vlr as Date, mascara);
			}
			
			//entende formato numérico
			if((mascara.indexOf("#0.0") >= 0 && StringUtils.contaCaracter(mascara, ".") == 1 && mascara.indexOf("-") == -1)
					 && !isNaN(Number(vlr))){
				var strDecimais:String = mascara.substr(mascara.indexOf(".") + 1);
				
				var perc:Boolean = false;
				
				if(mascara.indexOf("%") >= 0)
					perc = true;
				
				return FormataNumero.formata(Number(vlr), StringUtils.contaCaracter(strDecimais, "0")) + (perc ? String(" %") : "");
			}
			
			//segue definição de máscara customizada
			var strMasc:String = mascara;
			
			//troca zeros por #
			pattern = /0/g;
			strMasc = strMasc.replace(pattern, "#");
			
			//converte valor em string
			var strRetorno:String = String(vlr);
			
			//conta quantidade de 0 (sempre aparece) e # se torna espaço caso esteja vazio
			var qtdZeros:Number = StringUtils.contaCaracter(mascara, "0");
			var qtdMasc:Number = StringUtils.contaCaracter(mascara, "#");
			
			//previne que o formato informado seja menor que o valor passado
			if((qtdZeros + qtdMasc) < strRetorno.length) {
				strMasc = StringUtils.montarSequenciaCaracteres("#", strRetorno.length) + strMasc;
				strMasc = StringUtils.right(strMasc, strRetorno.length + (mascara.length - (qtdZeros + qtdMasc)));
			}
			
			//monta zeros restantes à esquerda do valor informado
			if(mascara != strMasc)
				strRetorno = StringUtils.completarCaracterEsquerda(strRetorno, qtdZeros, "0");
			
			//completa com espaços os # restantes
			strRetorno = StringUtils.completarCaracterEsquerda(strRetorno, qtdMasc + qtdZeros, " ");
			
			//aplica formato
			var ssf:SwitchSymbolFormatter = new SwitchSymbolFormatter();
			strRetorno = StringUtils.trim(ssf.formatValue(strMasc, strRetorno));
			
			//retira sobras da máscara
			while(StringUtils.trim(strRetorno).substr(0, 1) == "." || StringUtils.trim(strRetorno).substr(0, 1) == "-")
				strRetorno = strRetorno.substr(1);
			
			return strRetorno;
		}
	}
}